home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Games / NeXTmille / Source / CardView.m < prev    next >
Text File  |  1991-02-23  |  4KB  |  192 lines

  1.  
  2. /* Generated by Interface Builder */
  3.  
  4. #import "CardView.h"
  5. #import    "CardHolder.h"
  6. #import    "cards.h"
  7. #import    <appkit/appkit.h>
  8. #import    <assert.h>
  9. #import    <mach.h>
  10.  
  11.  
  12.     CardImage    *topFaceBitmap = nil;
  13.  
  14.     Window        *compositeWindow = nil;
  15.  
  16.     NXZone        *cardZone = NULL;
  17.     
  18.     
  19. @implementation CardView
  20.  
  21.  
  22. + initialize
  23. {
  24.  
  25.  
  26.     if( !cardZone )
  27.         cardZone = NXCreateZone( vm_page_size, vm_page_size, YES );
  28.     assert( cardZone );
  29.     
  30.     if( !topFaceBitmap )
  31.         topFaceBitmap = [[ CardImage allocFromZone:cardZone ] initFromFile:TOP_FACE ];
  32.     assert( topFaceBitmap );
  33.     
  34.     if( !compositeWindow ) {
  35.         NXRect    windowFrame = { 0, 0, CARD_WIDTH, CARD_HEIGHT };
  36.     
  37.         compositeWindow = [ Window newContent:&windowFrame 
  38.                                 style:NX_PLAINSTYLE 
  39.                                 backing:NX_RETAINED 
  40.                                 buttonMask:0 
  41.                                 defer:NO ];
  42.     }
  43.     
  44.     return nil;
  45. }
  46.  
  47.  
  48. - init
  49. {
  50.  
  51.     NXRect    cardFrame = { 0, 0, CARD_WIDTH, CARD_HEIGHT };
  52.  
  53.  
  54.     [ super init ];
  55.     showTopFaceFlag     = YES;
  56.     eventsEnabledFlag    = NO;
  57.     [[ self setFrame:&cardFrame ] setClipping:NO ];
  58.  
  59.     return self;
  60. }
  61.  
  62.  
  63. - free
  64. {
  65.  
  66.     [ bottomFaceBitmap free ];
  67.     
  68.     return [ super free ];
  69. }
  70.  
  71.  
  72. - setEventsEnabled:( BOOL )flag
  73. {
  74.  
  75.     eventsEnabledFlag = flag;
  76.     
  77.     return self;
  78. }
  79.  
  80.  
  81. - mouseDown:( NXEvent * )theEvent
  82. {
  83.  
  84.  
  85.     if( eventsEnabledFlag ) {
  86.         NXRect    windowFrame;
  87.         NXPoint    cardLocation = bounds.origin;
  88.     
  89.                                                 // Composite our card face to the composite window.
  90.                                                 //    Bring the window to the location of this view.
  91.         [[ compositeWindow contentView ] lockFocus ];
  92.         [[ compositeWindow contentView ] getFrame:&windowFrame ];
  93.         [ self drawSelf:&windowFrame : 1 ];
  94.         [[ compositeWindow contentView ] unlockFocus ];
  95.         [ self convertPoint:&cardLocation toView:nil ];
  96.         [ window convertBaseToScreen:&cardLocation ];
  97.         [[ compositeWindow moveTo: cardLocation.x : cardLocation.y ] orderFront:nil ];
  98.     
  99.                                                 // Add dragging to the window's mask and save the old
  100.                                                 //    mask to be restored when the mouse is released.
  101.                                                 //    This is not necessarily a good programming technique.
  102.                                                 //    (Bad programming on my part. For instance, what if 
  103.                                                 //    some other object, like one responding to the tracking
  104.                                                 //    rect altered the mask?  i'd clobber it when it is 
  105.                                                 //    restored in the mouseUp: method.).
  106.         oldMask = [ window addToEventMask:NX_MOUSEDRAGGEDMASK ];
  107.     
  108.                                                 //    Calculate the delta offset within the card's view
  109.                                                 //    for easy arithmetic while the card is being dragged.
  110.         cardDelta = theEvent->location;
  111.         [ self convertPoint:&cardDelta fromView:nil ];
  112.     } else
  113.         [[ self nextResponder ] mouseUp:theEvent ];
  114.     
  115.     return self;
  116. }
  117.  
  118.  
  119. - mouseUp:( NXEvent * )theEvent
  120. {
  121.  
  122.     if( eventsEnabledFlag ) {
  123.         [ window setEventMask:oldMask ];
  124.         [ compositeWindow orderOut:self ];
  125.         [ dragCoordinator cardReleased:self at:&theEvent->location ];
  126.     } else
  127.         [[ self nextResponder ] mouseUp:theEvent ];
  128.         
  129.     return self;
  130. }
  131.  
  132.  
  133. - mouseDragged:( NXEvent * )theEvent
  134. {
  135.  
  136.             
  137.     if( eventsEnabledFlag ) {
  138.         NXPoint        currentPoint = theEvent->location;
  139.         
  140.         [ window convertBaseToScreen:¤tPoint ];
  141.         [ compositeWindow moveTo:currentPoint.x - cardDelta.x : currentPoint.y - cardDelta.y ];
  142.         [ dragCoordinator cardDragged:&theEvent->location ];
  143.     } else
  144.         [[ self nextResponder ] mouseUp:theEvent ];
  145.  
  146.     return self;
  147. }
  148.  
  149.  
  150. - setDragCoordinator:( DragCoordinator * )anObject
  151. {
  152.  
  153.     dragCoordinator = anObject;
  154.  
  155.     return self;
  156. }
  157.  
  158.  
  159. - setShowTopFace:( BOOL )flag
  160. {
  161.  
  162.     showTopFaceFlag = flag;
  163.     
  164.     return self;
  165. }
  166.  
  167.  
  168. - drawSelf:( const NXRect * )rects :( int )rectCount
  169. {
  170.  
  171.     BOOL    performDraw = YES;
  172.     
  173.     
  174.     if([ superview respondsTo:@selector(subviewVisible:)])
  175.         if( ![ superview subviewVisible:self ])
  176.             performDraw = NO;
  177.     
  178.     if( performDraw ) {
  179.         if( showTopFaceFlag )
  180.             [ topFaceBitmap composite:NX_SOVER toPoint:&bounds.origin ];
  181.         else {
  182.             assert( bottomFaceBitmap );
  183.             [ bottomFaceBitmap composite:NX_SOVER toPoint:&bounds.origin ];
  184.         }
  185.     }
  186.     
  187.     return self;
  188. }
  189.  
  190.  
  191. @end
  192.